﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<queue>
using namespace std;

    //priority_queue<int> a;//大堆，降序，<
    //priority_queue<int, vector<int>, greater<int> > c;//小堆，升序,>
    //priority_queue<string> b;
    //for (int i = 0; i < 5; i++)
    //{
    //    a.push(i);
    //    c.push(i); 
    //}
    //while (!a.empty())
    //{
    //    cout << a.top() << ' ';
    //    a.pop();
    //}
    //cout << endl;
    //while (!c.empty())
    //{
    //    cout << c.top() << ' ';
    //    c.pop();
    //}
    //cout << endl;
    //b.push("abc");
    //b.push("abcd");
    //b.push("cbd");
    //while (!b.empty())
    //{
    //    cout << b.top() << ' ';
    //    b.pop();
    //}
    //cout << endl;
    /*vector<int> v1{ 1,33,4,5,7,9,2,111,4 };
    priority_queue<int> a(v1.begin(), v1.end());
    while (!a.empty())
    {
        cout << a.top() << ' ';
        a.pop();
    }*/


//template<typename Type>
//Type Max(const Type & a, const Type & b)
//{
//    cout << "This is Max<Type>" << endl;
//    return a > b ? a : b;
//}
//template<>
//int Max<int>(const int& a, const int& b)
//{
//    cout << "This is Max<int>" << endl;
//    return a > b ? a : b;
//}
//template<>
//char Max<char>(const char& a, const char& b)
//{
//    cout << "This is Max<char>" << endl;
//    return a > b ? a : b;
//}
//
//int Max(const int& a, const int& b)
//{
//    cout << "This is Max" << endl;
//    return a > b ? a : b;
//}
//int main()
//{
//    Max(10, 20); //"This is Max""This is Max<Type>" "This is Max<char>""This is Max<int>"
//    Max(12.34, 23.45);
//    Max('A', 'B');
//    Max<int>(20, 30);
//    return 0;
//}
//
//template<class T1, class T2>
//class Data
//{
//public:
//    Data() { cout << "Data<T1, T2>" << endl; }
//private:
//    T1 _d1;
//    T2 _d2;
//};
//template <class T1>
//class Data<T1, int>
//{
//public:
//    Data() { cout << "Data<T1, int>" << endl; }
//private:
//    T1 _d1;
//    int _d2;
//};
//template <typename T1, typename T2>
//class Data <T1*, T2*>
//{
//public:
//    Data() { cout << "Data<T1*, T2*>" << endl; }
//private:
//    T1 _d1;
//    T2 _d2;
//};
//template <typename T1, typename T2>
//class Data <T1&, T2&>
//{
//public:
//    Data(const T1& d1, const T2& d2)
//        : _d1(d1)
//        , _d2(d2)
//    {
//        cout << "Data<T1&, T2&>" << endl;
//    }
//private:
//    const T1& _d1;
//    const T2& _d2;
//};
//
//int main()
//{
//    Data<double, int> d1;"Data<T1, int>"
//    Data<int, double> d2; "Data<T1, T2>"
//    Data<int*, int*> d3;
//    Data<int&, int&> d4(1, 2);
//    return 0;
//
//}

//﻿class A
//{
//public:
//    A() { cout << "A::A()" << endl; }
//    ~A() { cout << "A::~A()" << endl; }
//  int a;
//};
//
//class B : public A
//{
//public:
//    B() { cout << "B::B()" << endl; }
//    ~B() { cout << "B::~B()" << endl; }
//    int b;
//};
//void f()
//{
//    B b;
//}
//

//
////关于以下菱形继承说法不正确的是（ ）
//﻿class B{ public: int b; };
//class C1 : public B { public: int c1; };
//class C2 : public B { public: int c2; };
//class D : public C1, public C2 { public: int d; };
//作业内容
//A.D总共占了20个字节
//B.B中的内容总共在D对象中存储了两份
//C.D对象可以直接访问从基类继承的b成员
//D.菱形继承存在二义性问题，尽量避免设计菱形继承

//﻿class Base1{ public: int _b1; };
//class Base2 { public: int _b2; };
//class Derive : public Base1, public Base2
//{
//    public: int _d;
//};
//int main() 
//{
//    Derive d;
//    Base1* p1 = &d;
//    Base2* p2 = &d;
//    Derive* p3 = &d;
//    return 0;
//}
//    A.p1 == p2 == p3
//    B.p1 < p2 < p3
//    C.p1 == p3 != p2
//    D.p1 != p2 != p3


//class A { 
//public: 
//    void test(float a) { cout << a; } 
//}; 
//class B :public A { 
//public: 
//    void test(int b) 
//    { 
//        cout << b; 
//    } 
//}; 
//void main() 
//{ 
//    A* a = new A; 
//    B* b = new B; 
//    a = b; 
//    a->test(1.1); 
//}

class A
{
public:
  void f1() { cout << "A::f1()" << endl; }
  virtual void f2() { cout << "A::f2()" << endl; }
  virtual void f3() { cout << "A::f3()" << endl; }
};
class B : public A
{
public:
    virtual void f1() { cout << "B::f1()" << endl; }
    virtual void f2() { cout << "B::f2()" << endl; }//重写
    void f3() { cout << "B::f3()" << endl; }//重写
};